/*
  学习目标：指定详细的泛型类型
  总结：T代表捕获的类型，🔔它可以和任意类型，组合使用 T[], :{ age: T}, [T, T]

*/

// const list = new Array('1')  // 捕获string  => string[]

type FindFirstFnType = <T>(aa: T[]) => T;

// 需求1：传入数组，得到第一项元素的类型
const findFirstFn: FindFirstFnType = (arr) => arr[0];
const result1 = findFirstFn([1]); //  期望返回类型为number
result1.toFixed(2);
const result2 = findFirstFn(['1']); // 期望返回类型为string
result2.startsWith('');

type FindNameFnType = <T>(aa: { name: T }) => T;

// 需求2： 传入对象，具有name键，捕获name值的类型作为返回值类型
const findNameFn: FindNameFnType = (obj) => obj.name;
const result3 = findNameFn({ name: '123' }); //返回值类型string
const result4 = findNameFn({ name: 123 }); //返回值类型number
